﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>Image Handles - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="Image handles can be used in place of image filenames to use a bitmap or icon located in the memory." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>

<body>
<h1>图像句柄</h1>

<p>要使用图标或位图句柄代替图像文件名, 请使用以下语法:</p>
<pre class="Syntax">HBITMAP:<i>bitmap-handle</i>
HICON:<i>icon-handle</i></pre>
<p>用实际句柄值替换 <em>bitmap-handle</em> 或 <em>icon-handle</em>. 例如, <code>"hicon:" handle</code>, 其中 <em>handle</em> 是包含图标句柄的变量.</p>
<p>以下内容支持此语法:</p>
<ul>
  <li><a href="../commands/GuiControls.htm#Picture">Gui.AddPicture</a>(和设置图片控件的内容时的 <a href="../objects/GuiControl.htm#Value">GuiCtrl.Value</a>).</li>
  <li><a href="../commands/ListView.htm#IL_Add">IL_Add</a></li>
  <li><a href="../commands/LoadPicture.htm">LoadPicture</a></li>
  <li><a href="../commands/GuiControls.htm#SB_SetIcon">SB.SetIcon</a></li>
  <li><a href="../commands/ImageSearch.htm">ImageSearch</a></li>
  <li><a href="../commands/TraySetIcon.htm">TraySetIcon</a> 或 <a href="../objects/Menu.htm#SetIcon">Menu.SetIcon</a></li>
</ul>
<p>位图或图标句柄是一个数字值, 用于标识内存中的位图或图标. 大多数脚本不需要处理句柄, 因为在大多数情况下, AutoHotkey 会从文件中加载图像并在不再需要时释放图像. 上面的语法是当脚本从其他资源中取得图标或位图时(如发送 WM_GETICON 消息到某个窗口) 供脚本使用的. 这也可以和 <a href="../commands/LoadPicture.htm">LoadPicture</a> 一起使用, 以避免多次从文件中加载图像.</p>
<p>默认情况下, AutoHotkey 会将句柄视为从文件中载入图像 - 例如, 销毁 GUI 时会删除 Picture 控件上使用的位图, 并且如果需要调整图像大小, 通常会立即删除该图像. 为避免这种情况, 请在冒号和句柄之间放置一个星号. 例如: <code>"hbitmap:*" handle</code>. 除了 ImageSearch, 这会强制该函数获取图像的副本.</p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExHICON">
<p><a href="#ExHICON"></a> 显示与模式匹配的前 <em>n</em> 个文件及其图标的菜单.</p>
<pre>pattern := A_ScriptDir "\*"
n := 15

<em>;创建菜单.</em>
Fmenu := Menu()

<em>; 为 SHFILEINFOW 结构体申请内存.</em>
fileinfo := Buffer(fisize := A_PtrSize + 688)

Loop Files, pattern, "FD"
{
    <em>; 为每个文件添加一个菜单项.</em>
    Fmenu.Add A_LoopFileName, (*) =&gt; "" <em>; Do nothing.</em>
    
    <em>; 获取文件的图标.</em>
    if DllCall("shell32\SHGetFileInfoW", "WStr", A_LoopFileFullPath
        , "UInt", 0, "Ptr", fileinfo, "UInt", fisize, "UInt", 0x100)
    {
        hicon := NumGet(fileinfo, 0, "Ptr")
        <em>; 设置菜单项的图标.</em>
        Fmenu.SetIcon A_Index "&amp;", "HICON:" hicon
        <em>; 因为我们使用了 ":" 而不是 ":*", 在程序退出或菜单被删除时
        ; 这些图标也会被自动释放.</em>
    }
}
until A_Index = n
Fmenu.Show
donothing:
return
</pre>
</div>
<p>另请参阅: <a href="../commands/LoadPicture.htm">LoadPicture</a>.</p>

</body>
</html>